home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / arcers / tar316.zip / ROLL.C < prev    next >
Text File  |  1994-04-03  |  6KB  |  243 lines

  1. /* roll.c - sequetial read/write cache programs
  2.  * This is the part of the Tar program (see file tar.c)
  3.  * Author: T.V.Shaporev
  4.  * Prepared for release 19 Oct 1990
  5.  * Called by store() (see file store.c)
  6.  */
  7. #include "sysup.h"
  8.  
  9. #include <stdio.h>
  10. #ifdef TRACE
  11.     extern FILE *myout;
  12. #    define Printf  (void)printf
  13. #endif
  14.  
  15. #ifdef MSDOS
  16. #   include <string.h>
  17. #   include <stdlib.h>
  18. #   include <fcntl.h>
  19. #   include <io.h>
  20. #   ifdef __TURBOC__
  21. #      include <dir.h>
  22. #      define write _write
  23. #      define read  _read
  24. #   else
  25. #      include <direct.h>
  26. #      include <sys\types.h>
  27. #   endif
  28. #   include <sys\stat.h>
  29. #   define CREATE(x) open((x),O_CREAT+O_TRUNC+O_RDWR+O_BINARY,S_IREAD+S_IWRITE)
  30. #   define FREE(x)   free(x)
  31. #else
  32. #   define CREATE(x) creat((x),0600)
  33. #   define FREE(x)   free((char *)(x))
  34.  
  35.     int  strlen();
  36.     char *malloc(), *strncpy(), *strncat(), *getenv(), *mktemp();
  37.     int  creat(), read(), write(), close(), unlink();
  38.     long lseek();
  39.     void free();
  40. #endif
  41.  
  42. #ifdef UNIX
  43. #    define TMPDIR   "/usr/tmp"
  44. #       define DIR      "/"
  45. #    define DEV      '\0'
  46. #    define MAXFNAME 512 /* Analagous to MAXNAMSIZ */
  47. #endif
  48.  
  49. #ifdef VMS
  50. #    define TMPDIR   "SYS$SCRATCH:"
  51. #       define DIR      "]"
  52. #    define DEV      ':'
  53. #       define MAXFNAME 512 /* ??? */
  54. #endif
  55.  
  56. #ifdef MSDOS
  57. #    define TMPDIR   ""
  58. #       define DIR      "\\"
  59. #    define DEV      ':'
  60. #    define MAXFNAME MAXPATH
  61. #endif
  62.  
  63. #define MAXPAGE  64   /* max cash is 0.5M */
  64. #define PAGESIZE 8192 /* Be careful !!! */
  65.  
  66. typedef struct {
  67.                   unsigned char * page[MAXPAGE];
  68.                   int             poz, npage, maxpage;
  69.                   char            name[MAXFNAME+1];
  70.                   int             handle;
  71.                } roll;
  72.  
  73. #include "roll.h"
  74.  
  75. static roll *r = (roll *)0;
  76.  
  77. int newroll(templ)
  78. char *templ;
  79. {
  80.    register i;
  81.    char *e;
  82.  
  83.    if (r) return 0;
  84.  
  85.    r = (roll *)malloc(sizeof(roll));
  86.    if (!r) return -1;
  87.    (r->page)[0] = (unsigned char *)malloc(PAGESIZE);
  88.    if (!((r->page)[0])) {
  89.       FREE((char *)r);
  90.       return -1;
  91.    }
  92.    for (i=1; i<MAXPAGE; i++) (r->page)[i] = (unsigned char *)0;
  93.    r->maxpage = MAXPAGE - 1;
  94.    r->npage   = 0;
  95.    r->poz     = 0;
  96.  
  97.    if ((e = getenv("TMP")) == (char *)0) {
  98.       (void)strncpy(r->name, TMPDIR, MAXFNAME);
  99.    } else {
  100.       (void)strncpy(r->name, e, MAXFNAME);
  101.    }
  102. #ifndef VMS
  103.    i = strlen(r->name) - 1;
  104.    if (r->name[i]!= *DIR
  105. #     ifdef DEV
  106.                          && r->name[i]!=DEV
  107. #     endif
  108.       ) (void)strncat(r->name,DIR,MAXFNAME);
  109. #endif
  110.    (void)mktemp(strncat(r->name, templ, MAXFNAME));
  111.  
  112.    r->handle  = -1;
  113. #ifdef TRACE
  114.   Printf("new roll: poz = %4d page = %d max = %2d handle = %d\n",
  115.                     r->poz,   r->npage, r->maxpage, r->handle);
  116. #endif
  117.    return 0;
  118. }
  119.  
  120. void delroll()
  121. {
  122.    register i;
  123.  
  124.    if (!r) return;
  125. #ifdef TRACE
  126.   Printf("del roll: poz = %4d page = %d max = %2d handle = %d\n",
  127.                     r->poz,   r->npage, r->maxpage, r->handle);
  128. #endif
  129.    for (i=0; i<MAXPAGE && (r->page)[i]; i++) FREE((r->page)[i]);
  130.    if (r->handle >= 0) {
  131.       (void)close (r->handle);
  132.       (void)unlink(r->name);
  133.    }
  134.    r = (roll *)0;
  135. }
  136.  
  137. int rewroll(flread)
  138. int flread;
  139. {
  140. #ifdef TRACE
  141.    Printf("rew roll: poz = %4d page = %d max = %2d handle = %d\n",
  142.                      r->poz,   r->npage, r->maxpage, r->handle);
  143. #endif
  144.    if (r->handle >= 0 && r->npage >= r->maxpage) {
  145.       if (write(r->handle,(char*)((r->page)[r->maxpage]),PAGESIZE)!=PAGESIZE)
  146.      return -1;
  147.       if (lseek(r->handle, 0L, 0) < 0) return -1;
  148.       if (flread && r->maxpage < 1) {
  149.      if (read(r->handle, (char*)((r->page)[0]), PAGESIZE) != PAGESIZE)
  150.         return -1;
  151.       }
  152.    }
  153.    r->npage = 0;
  154.    r->poz   = 0;
  155.    return 0;
  156. }
  157.  
  158. int rputc(i)
  159. int i;
  160. {
  161.    register unsigned char *p;
  162.  
  163.    if (r->poz >= PAGESIZE) {
  164. #ifdef TRACE
  165.      Printf("  roll 1: poz = %4d page = %d max = %2d handle = %d\n",
  166.                        r->poz,   r->npage, r->maxpage, r->handle);
  167. #endif
  168.       if (r->npage < r->maxpage) {
  169.          p = (r->page)[(r->npage)+1];
  170.          if (p) {
  171.             r->npage += 1;
  172.          } else if (r->handle < 0) {
  173.             p = (unsigned char *)malloc(PAGESIZE);
  174.         if (p) {
  175.            (r->page)[++(r->npage)] = p;
  176.            r->poz = 0;
  177.         } else {
  178.            r->maxpage = r->npage;
  179.         }
  180.          }
  181.       } else {
  182.          p = (unsigned char *)0;
  183.       }
  184.       if (!p) {
  185.          if (r->handle < 0) {
  186.         if ((r->handle = CREATE(r->name)) < 0) return EOF;
  187.      }
  188.      if (write(r->handle, (char*)((r->page)[r->maxpage]), PAGESIZE) !=
  189.          PAGESIZE)
  190.         return EOF;
  191.       }
  192.       r->poz = 0;
  193. #ifdef TRACE
  194.       Printf("  roll 2: poz = %4d page = %d max = %2d handle = %d\n",
  195.                         r->poz,   r->npage, r->maxpage, r->handle);
  196. #endif
  197.    }
  198.    *((r->page)[r->npage] + (r->poz)++) = i;
  199. #ifdef TRACE
  200.    if (r->npage < 0 || r->npage >= MAXPAGE || r->npage > r->maxpage) {
  201.       (void)fprintf(myout, "Alarm! npage out of range\n");
  202.    }
  203.    if (r->poz < 0 || r->poz > PAGESIZE) {
  204.       (void)fprintf(myout, "Alarm! poz out of range\n");
  205.    }
  206. #endif
  207.    return 0;
  208. }
  209.  
  210. int rgetc()
  211. {
  212.    if (r->poz >= PAGESIZE) {
  213. #ifdef TRACE
  214.       Printf("  roll 1: poz = %4d page = %d max = %2d handle = %d\n",
  215.                        r->poz,   r->npage, r->maxpage, r->handle);
  216. #endif
  217.       if (r->handle >= 0 && (r->npage)+1 >= r->maxpage) {
  218.      if (read(r->handle, (char*)((r->page)[r->maxpage]), PAGESIZE) !=
  219.          PAGESIZE) {
  220.         return EOF;
  221.      }
  222.      r->npage = r->maxpage;
  223.       } else {
  224.      if (r->handle < 0 && r->npage >= MAXPAGE) return EOF;
  225.      if (!(r->page)[++(r->npage)]) return EOF;
  226.       }
  227.       r->poz = 0;
  228. #ifdef TRACE
  229.       Printf("  roll 2: poz = %4d page = %d max = %2d handle = %d\n",
  230.                         r->poz,   r->npage, r->maxpage, r->handle);
  231. #endif
  232.    }
  233. #ifdef TRACE
  234.    if (r->npage < 0 || r->npage >= MAXPAGE || r->npage > r->maxpage) {
  235.       (void)fprintf(myout, "Alarm! npage out of range\n");
  236.    }
  237.    if (r->poz < 0 || r->poz >= PAGESIZE) {
  238.       (void)fprintf(myout, "Alarm! poz out of range\n");
  239.    }
  240. #endif
  241.    return *((r->page)[r->npage] + (r->poz)++);
  242. }
  243.